/**
题目:
在一个 m*n 的二维字符串数组中输出二叉树，并遵守以下规则：

行数 m 应当等于给定二叉树的高度。
列数 n 应当总是奇数。
根节点的值（以字符串格式给出）应当放在可放置的第一行正中间。根节点所在的行与列会将剩余空间划分为两部分（左下部分和右下部分）。你应该将左子树输出在左下部分，右子树输出在右下部分。左下和右下部分应当有相同的大小。即使一个子树为空而另一个非空，你不需要为空的子树输出任何东西，但仍需要为另一个子树留出足够的空间。然而，如果两个子树都为空则不需要为它们留出任何空间。
每个未使用的空间应包含一个空的字符串""。
使用相同的规则输出子树。
示例 1:

输入:
     1
    /
   2
输出:
[["", "1", ""],
 ["2", "", ""]]
示例 2:

输入:
     1
    / \
   2   3
    \
     4
输出:
[["", "", "", "1", "", "", ""],
 ["", "2", "", "", "", "3", ""],
 ["", "", "4", "", "", "", ""]]
示例 3:

输入:
      1
     / \
    2   5
   / 
  3 
 / 
4 
输出:
[["",  "",  "", "",  "", "", "", "1", "",  "",  "",  "",  "", "", ""]
 ["",  "",  "", "2", "", "", "", "",  "",  "",  "",  "5", "", "", ""]
 ["",  "3", "", "",  "", "", "", "",  "",  "",  "",  "",  "", "", ""]
 ["4", "",  "", "",  "", "", "", "",  "",  "",  "",  "",  "", "", ""]]
注意: 二叉树的高度在范围 [1, 10] 中。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/print-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
思路:
    先序遍历,分治思维
*/
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func printTree(root *TreeNode) [][]string {
    m := getM(root)
    n := getN(m)
    res := make([][]string, m)
    for i := 0; i < m;i++{
        res[i] = make([]string, n)
    }
    helper(res,0,n-1,0,root)
    return res
}
func helper(res [][]string, l, r, deep int, root *TreeNode){
    if root == nil || l > r{
        return
    }
    mid := l + (r - l)/2
    res[deep][mid] = strconv.Itoa(root.Val)
    helper(res,l, mid - 1,deep+1, root.Left)
    helper(res, mid + 1, r,deep+1, root.Right)
}
func getN(m int)int{
    if m == 0{
        return 0
    }
    return 2 * getN(m-1)+1
}
func getM(root *TreeNode)int{
    if root == nil{
        return 0
    }
    return max(getM(root.Left), getM(root.Right)) + 1
}
func max(a, b int)int{
    if a > b{
        return a
    }
    return b
}